package com.smile.frame.workflow.flowable.demo.service;

import cn.hutool.core.collection.CollUtil;
import com.smile.frame.workflow.flowable.demo.util.BpmnModelUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.UserTask;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 流程任务
 *
 * @author LGC
 */
public interface BpmTaskService {

    /**
     * 获取任务
     *
     * @param taskId 任务ID
     * @return 任务
     */
    Task getTask(String taskId);


    /**
     * 查询我的待办任务列表
     *
     * @param userId          用户ID
     * @param candidateGroups 候选组 如：部门id dept:1、角色id role:1、职务id position:1 、用户组 userGroup:1
     * @param businessKey     业务key
     * @return 待办任务列表
     */
    List<Task> queryMyTodoTask(String userId, List<String> candidateGroups, String businessKey);

    /**
     * 查询我的已办任务列表
     *
     * @param userId      处理人
     * @param businessKey 业务key
     * @return 已办任务列表
     */
    List<HistoricTaskInstance> queryMyFinishTask(String userId, String businessKey);


    /**
     * 审核通过任务
     *
     * @param userId    审核人
     * @param taskId    任务ID
     * @param variables 任务变量
     * @param reason    通过原因
     */
    void approvalTask(String userId, String taskId, Map<String, Object> variables, String reason);

    /**
     * 审核不通过任务
     *
     * @param userId    审核人
     * @param taskId    任务ID
     * @param variables 任务变量
     * @param reason    不通过原因
     */
    void rejectTask(String userId, String taskId, Map<String, Object> variables, String reason);

    /**
     * 委托任务
     *
     * @param userId         委托操作人
     * @param taskId         任务ID
     * @param delegateUserId 委托接收人
     * @param reason         委托原因
     */
    void delegateTask(String userId, String taskId, String delegateUserId, String reason);

    /**
     * 转办任务
     *
     * @param userId         转办操作人
     * @param taskId         任务ID
     * @param assigneeUserId 转办接收人
     * @param reason         转办原因
     */
    void transferTask(String userId, String taskId, String assigneeUserId, String reason);


    /**
     * 获取当前任务的可回退的任务集合
     *
     * @param userId 当前任务操作人
     * @param taskId 当前的任务ID
     * @return 可以回退的任务节点列表
     */
    List<UserTask> getUserTaskListByReturn(String userId, String taskId);

}
